home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / crt / sun4.md / start.s < prev   
Text File  |  1989-09-12  |  2KB  |  65 lines

  1. /*
  2.  * start.s --
  3.  *
  4.  *    Crt0 for sun4.  This is the header that sets up argc, argv and envp
  5.  *    for main() and then jumps there.  It also initializes the values
  6.  *    of certain registers.
  7.  *
  8.  * Copyright 1989 Regents of the University of California
  9.  * Permission to use, copy, modify, and distribute this
  10.  * software and its documentation for any purpose and without
  11.  * fee is hereby granted, provided that the above copyright
  12.  * notice appear in all copies.  The University of California
  13.  * makes no representations about the suitability of this
  14.  * software for any purpose.  It is provided "as is" without
  15.  * express or implied warranty.
  16.  */
  17. #include <kernel/machConst.h>
  18. .seg    "data"
  19. .asciz    "$Header: /sprite/src/lib/c/crt/sun4.md/RCS/start.s,v 1.2 89/03/26 20:19:51 mgbaker Exp Locker: mgbaker $ SPRITE (Berkeley)"
  20. .align    4
  21. .globl    _environ
  22. _environ:
  23. .word    0xffffffff
  24.  
  25. .align    8
  26. .seg    "text"
  27.  
  28. .globl    start
  29.  
  30. /*
  31.  * The stack pointer should be double-word aligned when it gets here.  At
  32.  * MACH_FULL_STACK_FRAME beneath it lies the user stack put together in
  33.  * DoExec().  At the top of this is the argc integer.  Below that is the argv
  34.  * stuff and below that is the
  35.  * environment stuff.
  36.  */
  37. start:
  38.     /*
  39.      * Argc is the first word on the top of the stack (top == lowest addr).
  40.      * This is followed immediately by the array of pointers to arguments
  41.      * (argv) and this is followed immediately by the array of pointers to
  42.      * the environment (envp).  We must calculate the address of envp by
  43.      * using the number of arguments given in argc.
  44.      * environ = (char *) argv + (argc + 1) * 4.
  45.      * And argv = top of stack plus sizeof (Address).
  46.      */
  47.     mov    %sp, %VOL_TEMP1
  48.     add    %VOL_TEMP1, MACH_FULL_STACK_FRAME, %VOL_TEMP1
  49.     ld    [%VOL_TEMP1], %o0        /* argc */
  50.     add    %VOL_TEMP1, 4, %o1        /* argv pointer */
  51.     add    %o0, 1, %o2
  52.     sll    %o2, 2, %o2
  53.     add    %o2, %o1, %o2        /* envp pointer */
  54.     set    _environ, %o3
  55.     st    %o2, [%o3]        /* store addr of env into environ */
  56.     
  57.     /* Mark last stack frame so debugger can tell bottom of stack. */
  58.     clr    %fp
  59.  
  60.     /* Off to main routine with arguments argc, argv, envp */
  61.     call    _main, 3
  62.     nop
  63.     call    _exit
  64.     nop
  65.